using System;
using ModernUO.Serialization;
using Server.Mobiles;
using Server.Targeting;

namespace Server.Items;

[SerializationGenerator(0, false)]
public partial class OilCloth : Item, IScissorable, IDyable
{
    [Constructible]
    public OilCloth() : base(0x175D) => Hue = 2001;

    public override int LabelNumber => 1041498; // oil cloth

    public override double DefaultWeight => 1.0;

    public bool Dye(Mobile from, DyeTub sender)
    {
        if (Deleted)
        {
            return false;
        }

        Hue = sender.DyedHue;

        return true;
    }

    public bool Scissor(Mobile from, Scissors scissors)
    {
        if (Deleted || !from.CanSee(this))
        {
            return false;
        }

        ScissorHelper(from, new Bandage(), 1);

        return true;
    }

    public override void OnDoubleClick(Mobile from)
    {
        if (IsChildOf(from.Backpack))
        {
            from.BeginTarget(-1, false, TargetFlags.None, OnTarget);
            from.SendLocalizedMessage(1005424); // Select the weapon or armor you wish to use the cloth on.
        }
        else
        {
            from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
        }
    }

    public void OnTarget(Mobile from, object obj)
    {
        // TODO: Need details on how oil cloths should get consumed here

        if (!IsChildOf(from.Backpack))
        {
            from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
        }
        else if (obj is Item item && item.RootParent != from)
        {
            from.SendLocalizedMessage(1005425); // You may only wipe down items you are holding or carrying.
        }
        else if (obj is BaseWeapon weapon)
        {
            if (weapon.Poison == null || weapon.PoisonCharges <= 0)
            {
                // Hmmmm... this does not need to be cleaned.
                from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1005422);
            }
            else
            {
                if (weapon.PoisonCharges < 2)
                {
                    weapon.PoisonCharges = 0;
                }
                else
                {
                    weapon.PoisonCharges -= 2;
                }

                if (weapon.PoisonCharges > 0)
                {
                    from.SendLocalizedMessage(1005423); // You have removed some of the caustic substance, but not all.
                }
                else
                {
                    from.SendLocalizedMessage(1010497); // You have cleaned the item.
                }
            }
        }
        else if (obj == from && obj is PlayerMobile pm)
        {
            if (pm.BodyMod == 183 || pm.BodyMod == 184)
            {
                pm.SavagePaintExpiration = TimeSpan.Zero;

                pm.BodyMod = 0;
                pm.HueMod = -1;

                from.SendLocalizedMessage(1040006); // You wipe away all of your body paint.

                Consume();
            }
            else
            {
                // Hmmmm... this does not need to be cleaned.
                from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1005422);
            }
        }
        else if (obj is BaseBeverage beverage)
        {
            if (beverage.Content == BeverageType.Liquor)
            {
                var bomb = new Firebomb(beverage.ItemID)
                {
                    Name = beverage.Name
                };

                beverage.ReplaceWith(bomb);

                from.SendLocalizedMessage(1060580); // You prepare a firebomb.
                Consume();
            }
        }
        else if (obj is Firebomb)
        {
            from.SendLocalizedMessage(1060579); // That is already a firebomb!
        }
        else
        {
            from.SendLocalizedMessage(1005426); // The cloth will not work on that.
        }
    }
}
